package com.shwread.android.qysw.activity;

/*
 * ========================================================
 * Copyright(c) 2014 杭州龙骞科技-版权所有
 * ========================================================
 * 本软件由杭州龙骞科技所有, 未经书面许可, 任何单位和个人不得以
 * 任何形式复制代码的部分或全部, 并以任何形式传播。
 * 公司网址
 * http://www.hzdracom.com/
 * ========================================================
 */

import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.ConsoleMessage;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebChromeClient.CustomViewCallback;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;

import com.shwread.android.qysw10000182.R;
import com.shwread.android.ui.widget.LoadingView;
import java.util.HashMap;
import java.util.Map;
import logic.util.Util;
import logic.util.logutil.LogUtil;


/**
 * @Project： qysw_http
 * @Title：WebViewActivity
 * @Description：
 * @Author：wayne
 * @Date：2015年5月13日下午2:47:46
 */
public class LionWebViewActivity
        extends
        BaseBusinessActivity
        implements
        OnClickListener
{
	private TextView              tvTitle;
	private Button                btnBack;
	private WebView               webView;
	private FrameLayout           fLayWebView;
	private View                  rlayTitle;
	private LoadingView           loadingView;
	private ImageView ivPersion;
	
	private HarlanWebChromeClient chromeClient = null;
	private CustomViewCallback    myCallBack   = null;
	private View                  myView       = null; //视频全屏时的view
	private String                url;
	private String                accessToken;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.trainingexam_lay);
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
		Bundle bundle = getIntent().getExtras();
		if (null != bundle)
		{
			accessToken = bundle.getString("accessToken");
			url = bundle.getString("url");
		}
		
		initView();
		//		initLoadingView();
		setListener();
		setWebView();
	}
	
	void initView() {
		tvTitle = (TextView) findViewById(R.id.common_header_name);
		tvTitle.setText(getResources().getString(R.string.maintab_train));
		btnBack = (Button) findViewById(R.id.common_header_back);
		btnBack.setVisibility(View.VISIBLE);
		ivPersion = (ImageView) findViewById(R.id.common_header_persion);
		ivPersion.setVisibility(View.GONE);
		webView = (WebView) findViewById(R.id.train_webview_web);
		fLayWebView = (FrameLayout) findViewById(R.id.train_webview_flay);
		rlayTitle = findViewById(R.id.common_title_layout);
		loadingView = (LoadingView) findViewById(R.id.train_loading_view);
	}
	
	private void initLoadingView() {
		loadingView.setLoadingAnim(R.drawable.home_progress);
		//		loadingView.setLoadingAnim(R.anim.column_switch_anim);
		loadingView.changeLoadingStatus(0);
		
		loadingView.setVisibility(View.VISIBLE);
		fLayWebView.setVisibility(View.GONE);
	}
	
	void setListener() {
		btnBack.setOnClickListener(this);
		ivPersion.setOnClickListener(this);
	}
	
	@SuppressLint ("SetJavaScriptEnabled")
	private void setWebView() {
		/*
		 * webSettings 保存着WebView中的状态信息。
		 * 当WebView第一次被创建时，webSetting中存储的都为默认值。
		 * WebSetting和WebView一一绑定的。
		 * 如果webView被销毁了，那么我们再次调用webSetting中的方法时，会抛出异常。
		 */
		WebSettings webSettings = webView.getSettings();
		
		webSettings.setJavaScriptEnabled(true);
		webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
		
		webView.setWebViewClient(new HarlanWebViewClient());
		
		chromeClient = new HarlanWebChromeClient();
		webView.setWebChromeClient(chromeClient);
		
		//		webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
		webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
		
		webView.setHorizontalScrollBarEnabled(false);
		webView.setVerticalScrollBarEnabled(false);
		
		webSettings.setSupportZoom(false);
		webSettings.setPluginState(WebSettings.PluginState.ON);
		webSettings.setLoadWithOverviewMode(true);
		webSettings.setUseWideViewPort(true); //适应屏幕
		
		loadUrl();
		
	}
	
	@Override
	protected void onResume() {
		super.onResume();
//		initLoadingView();
		loadUrl();
	}
	
	@Override
	protected void onPause() {
		super.onPause();
		clearCache();
	}
	
	/**
	 * @Title: loadUrl
	 * @Description: 加载培训URL
	 * @return void 返回类型
	 * @throws
	 */
	void loadUrl() {
		Map<String, String> headers = new HashMap<String, String>();
		headers.put("ACCESSTOKEN", accessToken);
		webView.loadUrl(url, headers);
//		webView.loadUrl("http://www.youku.com/");
	}
	
	/**
	 * @Title: clearCache
	 * @Description: 设置空白页
	 * @return void 返回类型
	 * @throws
	 */
	public void clearCache() {
		if (null != webView) webView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
	}
	
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == event.KEYCODE_BACK)
		{
			if (myView == null)
			{
				return super.onKeyDown(keyCode, event);
			}
			else
			{
				chromeClient.onHideCustomView();
				return true;
			}
		}
		return super.onKeyDown(keyCode, event);
	}
	
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
			case R.id.common_header_back:
				if (webView.canGoBack()) webView.goBack();
				else finish();
				break;
			default:
				break;
		}
	}
	
	/***
	 * webChromeClient主要是将javascript中相应的方法翻译成android本地方法
	 * 例如：我们重写了onJsAlert方法，那么当页面中需要弹出alert窗口时，便
	 * 会执行我们的代码，按照我们的Toast的形式提示用户。
	 */
	class HarlanWebChromeClient
	        extends
	        WebChromeClient
	{
		
		@Override
		public void onShowCustomView(View view, CustomViewCallback callback) {
			if (myView != null)
			{
				callback.onCustomViewHidden();
				return;
			}
			fLayWebView.removeView(webView);
			fLayWebView.addView(view);
			rlayTitle.setVisibility(View.GONE);
			myView = view;
			myCallBack = callback;
			setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
		}
		
		@Override
		public void onHideCustomView() {
			if (myView == null) { return; }
			fLayWebView.removeView(webView);
			myView = null;
			fLayWebView.addView(webView);
			rlayTitle.setVisibility(View.VISIBLE);
			myView = null;
			setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
			myCallBack.onCustomViewHidden();
		}
		
		@Override
		public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
			Log.d("ZR", consoleMessage.message() + " at " + consoleMessage.sourceId() + ":" + consoleMessage.lineNumber());
			return super.onConsoleMessage(consoleMessage);
		}
		
		/*
		 * 此处覆盖的是javascript中的alert方法。
		 * 当网页需要弹出alert窗口时，会执行onJsAlert中的方法
		 * 网页自身的alert方法不会被调用。
		 */
		@Override
		public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
			Util.showToast(LionWebViewActivity.this, message);
			/*
			 * 此处代码非常重要，若没有，android就不能与js继续进行交互了，
			 * 且第一次交互后，webview不再展示出来。
			 * result：A JsResult to confirm that the user hit enter.
			 * 我的理解是，confirm代表着此次交互执行完毕。只有执行完毕了，才可以进行下一次交互。
			 */
			result.confirm();
			return true;
		}
		
		/*
		 * 此处覆盖的是javascript中的confirm方法。
		 * 当网页需要弹出confirm窗口时，会执行onJsConfirm中的方法
		 * 网页自身的confirm方法不会被调用。
		 */
		@Override
		public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
			return true;
		}
		
		/*
		 * 此处覆盖的是javascript中的confirm方法。
		 * 当网页需要弹出confirm窗口时，会执行onJsConfirm中的方法
		 * 网页自身的confirm方法不会被调用。
		 */
		@Override
		public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
			return true;
		}
		
		/*
		 * 如果页面被强制关闭,弹窗提示：是否确定离开？
		 * 点击确定 保存数据离开，点击取消，停留在当前页面
		 */
		@Override
		public boolean onJsBeforeUnload(WebView view, String url, String message, JsResult result) {
			return true;
		}
	}
	
	@SuppressLint ("NewApi")
	class HarlanWebViewClient
	        extends
	        WebViewClient
	{
		@Override
		public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
			WebResourceResponse response = null;
			response = super.shouldInterceptRequest(view, url);
			return response;
		}
		
		/*
		 * 点击页面的某条链接进行跳转的话，会启动系统的默认浏览器进行加载，调出了我们本身的应用
		 * 因此，要在shouldOverrideUrlLoading方法中
		 */
		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			//使用当前的WebView加载页面
			if (url.contains("tel:"))
			{
				Intent intent = new Intent();
				intent.setAction(Intent.ACTION_DIAL);
				intent.setData(Uri.parse(url));
				startActivity(intent);
				return true;
			}
			view.loadUrl(url);
			return true;
		}
		
		/*
		 * 网页加载完毕(仅指主页，不包括图片)
		 */
		@Override
		public void onPageStarted(WebView view, String url, Bitmap favicon) {
			super.onPageStarted(view, url, favicon);
		}
		
		/*
		 * 网页加载完毕(仅指主页，不包括图片)
		 */
		@Override
		public void onPageFinished(WebView view, String url) {
			super.onPageFinished(view, url);
			loadingView.setVisibility(View.GONE);
			fLayWebView.setVisibility(View.VISIBLE);
		}
		
		/*
		 * 加载页面资源
		 */
		@Override
		public void onLoadResource(WebView view, String url) {
			super.onLoadResource(view, url);
		}
		
		/*
		 * 错误提示
		 */
		@Override
		public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
			LogUtil.e("webview", description);
			super.onReceivedError(view, errorCode, description, failingUrl);
			loadingView.setVisibility(View.GONE);
			fLayWebView.setVisibility(View.VISIBLE);
		}
	}
	
	@Override
	public Handler getUIHandler() {
		// TODO Auto-generated method stub
		return null;
	};
	
	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		// TODO Auto-generated method stub
		super.onConfigurationChanged(newConfig);
	}
}
